// Example model schema from the Drizzle docs
// https://orm.drizzle.team/docs/sql-schema-declaration

import { sql } from "drizzle-orm";
import {
  pgTableCreator,
  timestamp,
  varchar,
  primaryKey,
  boolean,
} from "drizzle-orm/pg-core";

/**
 * This is an example of how to use the multi-project schema feature of Drizzle ORM. Use the same
 * database instance for multiple projects.
 *
 * @see https://orm.drizzle.team/docs/goodies#multi-project-schema
 */
export const createTable = pgTableCreator((name) => `codemariner_${name}`);

export const diagrams = createTable(
  "diagrams",
  {
    username: varchar("username", { length: 256 }).notNull(),
    repo: varchar("repo", { length: 256 }).notNull(),
    diagram: varchar("diagram", { length: 30000 }).notNull(), // 更大的长度以适应复杂图表
    explanation: varchar("explanation", { length: 30000 })
      .notNull()
      .default("No explanation provided"), 
    lastGenerated: timestamp("last_generated", { withTimezone: true })
      .default(sql`CURRENT_TIMESTAMP`)
      .notNull(),
    usedOwnKey: boolean("used_own_key").default(false),
  },
  (table) => ({
    pk: primaryKey({ columns: [table.username, table.repo] }),
  }),
);

// 兼容性别名，确保现有代码继续工作
export const diagramCache = diagrams;

/**
 * 文档存储表 - 用于持久化生成的项目技术文档
 * 
 * 该表存储由AI生成的Markdown格式项目文档，支持以下功能：
 * - 按用户名和仓库名以及文档类型作为主键，确保每个仓库每种类型只有一个最新文档
 * - 存储文档内容(document)，支持最大100000字符的长文档
 * - 记录文档生成时间(lastGenerated)，用于显示和缓存控制
 * - 跟踪是否使用了用户自己的API密钥(usedOwnKey)
 * - 使用文档类型(documentType)区分不同的专业技术文档
 * 
 * 文档内容与diagrams表分开存储，因为文档通常比图表大得多，
 * 且需要独立的缓存和检索逻辑。
 */
export const documents = createTable(
  "documents",
  {
    username: varchar("username", { length: 256 }).notNull(),
    repo: varchar("repo", { length: 256 }).notNull(),
    document: varchar("document", { length: 100000 }).notNull(), // 文档通常比图表大得多
    documentType: varchar("document_type", { length: 50 }).notNull().default("overview-doc"),
    lastGenerated: timestamp("last_generated", { withTimezone: true })
      .default(sql`CURRENT_TIMESTAMP`)
      .notNull(),
    usedOwnKey: boolean("used_own_key").default(false),
  },
  (table) => ({
    pk: primaryKey({ columns: [table.username, table.repo, table.documentType] }),
  }),
);
